package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import educar.db.JPA;

public class Actividad {
	private String cod_actividad;
	private Materia materia;
	private String descripcion;
	private String nro_actividad;
	private String file_path;
	private static JPA jpa= new JPA();
	
	/**
	 * metodo constructor de la clase, crea una nueva Actividad
	 * @param newCod_actividad "int que contiene el codigo de cada actividad, que es unico" 
	 * @param newCod_actividad "int que contiene el codigo de la materia que contiene la actividad"
	 * @param newDescripcion "String que contiene la descripcion de cada actividad"
	 */
	public Actividad(String nro_actividad,String cod_actividad, Materia materia, String descripcion, String file_path){
		setCod_actividad(cod_actividad);
		setMateria(materia);
		setDescripcion(descripcion);
		setNro_actividad(nro_actividad);
		setFile_path(file_path);
	}
	
	/**
	 * retorna el codigo de la actividad
	 * @return int con el codigo de actividad
	 */
	public String getCod_actividad(){
		return cod_actividad;
	}
	
	/**
	 * permite establecer el codigo de una actividad
	 * @param newCod_actividad "int que cotiene el codigo de una actividad"
	 */
	public void setCod_actividad(String newCod_actividad){
		cod_actividad = newCod_actividad;
	}


	/**
	 * retorna el codigo de la materia a la que pertenece la actividad
	 * @return int con el codigo de materia
	 */
	public Materia getMateria(){
		return materia;
	}
	
	/**
	 * permite establecer el codigo de la materia a la que pertenece la actividad
	 * @param newCod_materia "int que cotiene el codigo de una materia"
	 */
	public void setMateria(Materia newMateria){
		materia = newMateria;
	}

	/**
	 * permite establecer la descripcion de la actividad
	 * @param newDescripcion "String que cotiene la descripcion de la actividad"
	 */
	public String getDescripcion(){
		return descripcion;
	}
	
	/**
	 * retorna la descripcion de la actividad
	 * @return String con la descripcion
	 */
	public void setDescripcion(String newDescripcion){
		descripcion = newDescripcion;
	}
	
	/**
	 * setea el numero de la actividad
	 * @param nro_actividad
	 */
	public void setNro_actividad(String nro_actividad) {
		this.nro_actividad = nro_actividad;
	}
	
	/**
	 * Establece el numero de la actividad
	 * @return
	 */
	public String getNro_actividad() {
		return nro_actividad;
	}

	/**
	 * obtiene el path del archivo subido
	 * @return the file_path
	 */
	public String getFile_path() {
		return file_path;
	}

	/**
	 * establece el path del archivo subido
	 * @param file_path the file_path to set
	 */
	public void setFile_path(String file_path) {
		this.file_path = file_path;
	}

	/**
	 * Permite guardar una actividad en la base de datos
	 * @return true o false dependiendo existo o fracaso guardando
	 */
	public boolean save() {
			try {
				Actividad.getActividadByCodigo(getCod_actividad());
				return false;
			} catch (actividadNotFound e1) {
				String[] columns = { "cod_actividad","cod_materia", "descripcion_act", "file_path"};
				PreparedStatement stm = jpa.newRecord("actividad", columns);		
				try {
					stm.setString(1, getCod_actividad());
					stm.setString(2, getMateria().getCodigo());
					stm.setString(3, getDescripcion());
					stm.setString(4, getFile_path());
				} catch (SQLException e) {
					e.printStackTrace();
					return false;
				}				
				jpa.create(stm);
				return true;
			}
	}


	/**
	 * Permite eliminar una actividad en la base de datos
	 */
	public void destroy() {
		try {
			jpa.destroy("actividad", "cod_actividad", getCod_actividad());
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * dado el codigo te retorna una actividad
	 * @param cod_actividad "codigo de la actividad"
	 * @return "objeto actividad con ese codigo"
	 * @throws actividadNotFound "por si no existe una con ese codigo"
	 */
	public static Actividad getActividadByCodigo(String cod_actividad) throws actividadNotFound {
		ResultSet rs = null;
		Actividad t = null;
		rs = jpa.getByField("actividad", "cod_actividad", cod_actividad);
		try {
			if (rs.next()) {
				t = new Actividad(rs.getString(1),rs.getString(2) ,Materia.getMateriaByCodigo(rs.getString(3)),rs.getString(4),rs.getString(5));
			} 
			else {
				throw new actividadNotFound();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (materiaNotFound e) {
			e.printStackTrace();
		}
		return t;
	}
	
	
	/**
	 * Obtiene la tabla de actividades de una materia dada
	 * @param materia Materia a la que buscar las actividades
	 * @return Object[][] con la tabla actividad solo las columnas
	 * nro_actividad,cod_actividad,descripcion_act
	 */
	public static Object[][] getActividadTableByMateria(Materia materia){
		Object[][] actividadTable = jpa.ResultSetToArray(jpa.showProyection("actividad","nro_actividad,cod_actividad,descripcion_act", "cod_materia", materia.getCodigo()));
		return actividadTable;
	}
	

	/**
	 * Redefinicion del metodo toString para la clase
	 */
	public String toString() {
		return " Cod: "+this.getCod_actividad()+"  Descripcion: "+this.getDescripcion();				
	}
	
}



